package modelo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import modelo.DTO.DTODataMining;
import modelo.helper.ChatHelper;
import modelo.helper.ForumHelper;
import modelo.helper.GlosarioHelper;
import modelo.helper.SequencesHelper;
import modelo.helper.QuizHelper;
import modelo.helper.RecursoHelper;
import modelo.helper.UserHelper;
import modelo.helper.WikiHelper;

/**
 * MoodleHelper es la clase que nos va ha hacer todas las consultas mediante hibernate
 *
 * @version 1.1
 * @author Ion B. Padilla
 */
public class MoodleHelper {
    private static MoodleHelper instance;

    public MoodleHelper() {
    }

    public static MoodleHelper getInstance() {
        if (null == instance) {
            instance = new MoodleHelper();
        }
        return instance;
    }



    //USO DE LOS USUARIOS



    /**
     * Metodo para conseguir un MdlUser por un nombre de alumno
     * @param nombre el nombre del alumno a convertir
     */
    public MdlUser getMdlUserByName(String nombre) {
        UserHelper uHelper = UserHelper.getInstance();
        return uHelper.getMdlUserByName(nombre);
    }

    /**
     * Metodo para conseguir las visitas de las páginas de moodle por alumnos
     */
    public List<DTODataMining> getVisitasPorAlumnos() {
        UserHelper uHelper = UserHelper.getInstance();
        return uHelper.getVisitasPorAlumnos();
    }

    /**
     * Metodo para conseguir las visitas por un alumno
     * @param nombre el nombre del alumno del que queremos saber las visitas
     */
    public DTODataMining getVisitasPorAlumno(String nombre) {
        UserHelper uHelper = UserHelper.getInstance();
        return uHelper.getVisitasPorAlumno(nombre);
    }
    /**
     * Metodo para conseguir las visitas de las páginas de moodle por curso
     * @param curso curso al que se va a consultar
     */
    public List<DTODataMining> getVisitasPorAlumnosPorCurso(int curso){
        UserHelper uHelper = UserHelper.getInstance();
        return uHelper.getVisitasPorAlumnosPorCurso(curso);
    }
    /**
     * Metodo para conseguir las visitas por un alumno y por curso
     * @param nombre el nombre del alumno del que queremos saber las visitas
     * @param curso curso al que se va a consultar
     */
    public DTODataMining getVisitasPorAlumnoPorCurso(String nombre, int curso){
        UserHelper uHelper = UserHelper.getInstance();
        return uHelper.getVisitasPorAlumnoPorCurso(nombre,curso);
    }

    /**
     * Metodo para conseguir las visitas únicas de las páginas de moodle por alumnos
     */
    public List<DTODataMining> getVisitasDifPorAlumnos() {
        UserHelper uHelper = UserHelper.getInstance();
        return uHelper.getVisitasDifPorAlumnos();
    }

    /**
     * Metodo para conseguir las visitas únicas por un alumno
     * @param nombre el nombre del alumno del que queremos saber las visitas únicas
     */
    public DTODataMining getDifVisitasPorAlumno(String nombre) {
        UserHelper uHelper = UserHelper.getInstance();
        return uHelper.getDifVisitasPorAlumno(nombre);
    }
    /**
     * Metodo para conseguir las visitas únicas de las páginas de moodle por curso
     * @param curso curso al que se va a consultar
     */
    public List<DTODataMining> getVisitasDifPorAlumnosPorCurso(int curso){
        UserHelper uHelper = UserHelper.getInstance();
        return uHelper.getVisitasDifPorAlumnosPorCurso(curso);
    }
    /**
     * Metodo para conseguir las visitas únicas por un alumno y por curso
     * @param nombre el nombre del alumno del que queremos saber las visitas únicas
     * @param curso curso al que se va a consultar
     */
    public DTODataMining getDifVisitasPorAlumnoPorCurso(String nombre, int curso){
        UserHelper uHelper = UserHelper.getInstance();
        return uHelper.getDifVisitasPorAlumnoPorCurso(nombre,curso);
    }

    /**
     * Metodo para conseguir la lista de alumnos del curso
     */
    public List<DTODataMining> getAlumnos() {
        UserHelper uHelper=UserHelper.getInstance();
        return uHelper.getAlumnos();
    }
    /**
     * Metodo para conseguir la lista de alumnos del curso
     * @param curso curso al que vamos a consultar
     */
    public List<DTODataMining> getAlumnosPorCurso(int curso){
        UserHelper uHelper=UserHelper.getInstance();
        return uHelper.getAlumnosPorCurso(curso);
    }
    /**
     * Metodo para conseguir la lista de alumnos del en formato String
     */
    public List<String> getAlumnosString() {
        UserHelper uHelper=UserHelper.getInstance();
        return uHelper.getAlumnosString();
    }
    /**
     * Metodo para conseguir la lista de alumnos del curso en formato String
      * @param curso curso al que vamos a consultar
     */
    public List<String> getAlumnosStringPorCurso(int curso){
        UserHelper uHelper=UserHelper.getInstance();
        return uHelper.getAlumnosStringPorCurso(curso);
    }

    public ArrayList<String>  getAlumnosStringPorCursoLista(int curso){
        UserHelper uHelper=UserHelper.getInstance();
        return uHelper.getAlumnosStringPorCursoLista(curso);
    }

    /**
     * Metodo para conseguir un alumno pasandole el nombre
     * @param nombre el nombre del alumno
     */
    public DTODataMining getAlumno(String nombre) {
        UserHelper uHelper=UserHelper.getInstance();
        return uHelper.getAlumno(nombre);
    }


    


    //USO DE LOS RECURSOS

    public List<DTODataMining> getCourses(){
        RecursoHelper rHelper = new RecursoHelper();
        return rHelper.getCourses();
    }


    /**
     * Metodo para conseguir loas recursos usados por alumnos
     */
    public List<DTODataMining> getRecursosDifPorAlumnos() {
        RecursoHelper rHelper = new RecursoHelper();
        return rHelper.getRecursosDifPorAlumnos();
    }
    /**
     * Metodo para conseguir loas recursos usados por Curso
     * @param curso el curso donde consultamos
     */
    public List<DTODataMining> getRecursosDifPorCursoAlumnos(int curso){
        RecursoHelper rHelper = new RecursoHelper();
        return rHelper.getRecursosDifPorCursoAlumnos(curso);
    }
    /**
     * Metodo para conseguir los recursos utilizados por un alumno
     * @param nombre el nombre del alumno del que queremos saber los recursos utilizados
     */
    public DTODataMining getRecursosDifPorAlumno(String nombre) {
        RecursoHelper rHelper = new RecursoHelper();
        return rHelper.getRecursosDifPorAlumno(nombre);
    }
    /**
     * Metodo para conseguir los recursos utilizados por un alumno
     * @param nombre el nombre del alumno del que queremos saber los recursos utilizados
     * @param curso curso del que queremos consultar
     */
    public DTODataMining getRecursosDifPorCursoAlumno(int curso,String nombre){
        RecursoHelper rHelper = new RecursoHelper();
        return rHelper.getRecursosDifPorCursoAlumno(curso,nombre);
    }
    /**
     * Metodo para conseguir la puntuacion en tipos de recursos
     */
    public ArrayList<DTODataMining> getTipoRecursos() {
        RecursoHelper rHelper = new RecursoHelper();
        return rHelper.getTipoRecursos((ArrayList<String>) this.getAlumnosString());
    }
    /**
     * Metodo para conseguir una puntuacion por cada recurso sensitivo (visual o multimedia) utilizado por curso
     * @param alumnos lista de alumnos a analizar
     * @param curso curso en el que vamos a hacer la consulta
     */
    public ArrayList<DTODataMining> getTipoRecursosPorCurso( int curso){
        RecursoHelper rHelper = new RecursoHelper();
        return rHelper.getTipoRecursosPorCurso((ArrayList<String>) this.getAlumnosStringPorCurso(curso),curso);
    }




    //USO DE LAS SECUENCIAS



    
    /**
     * Metodo para conseguir el numero de eventos que se han producido en los recursos entre dos fechas
     * @param fInicio Fecha de inicio
     * @param fFin Fecha de fin
     * @param userId identificador del usuario
     */
    public ArrayList<MdlLog> getLogFromDates(Date fInicio, Date fFin, Long userId) {
        SequencesHelper lHelper = SequencesHelper.getInstance();
        return lHelper.getLogFromDates(fInicio, fFin, userId);
    }
    /**
     * Metodo para conseguir el numero de logins por alumno
     */
    public ArrayList<DTODataMining> getLogins() {
        SequencesHelper lHelper;
        lHelper=SequencesHelper.getInstance();
        return lHelper.getLoginsPorAlumnos();
    }
    /**
     * Metodo para conseguir los logins de los alumnos por curso
     * @param curso curso al que vamos a consultar
     */
    public ArrayList<DTODataMining> getLoginsPorAlumnosPorCurso (int curso){
        SequencesHelper lHelper;
        lHelper=SequencesHelper.getInstance();
        return lHelper.getLoginsPorAlumnosPorCurso(curso);
    }
    /**
     * Metodo para conseguir los logins de los alumnos por alumno
     * @param nombre nombre del alumno
     */
    public DTODataMining getLoginsPorAlumno(String nombre){
        SequencesHelper lHelper;
        lHelper=SequencesHelper.getInstance();
        return lHelper.getLoginsPorAlumno(nombre);
    }
    /**
     * Metodo para conseguir los logins de los alumnos por alumno y por curso
     * @param nombre nombre del alumno
     * @param curso curso en el que vamos a consultar
     */
    public DTODataMining getLoginsPorAlumnoPorCurso(String nombre,int curso){
        SequencesHelper lHelper;
        lHelper=SequencesHelper.getInstance();
        return lHelper.getLoginsPorAlumnoPorCurso(nombre,curso);
    }
    /**
     * Metodo para conseguir la variable de secuencia de los alumnos por curso
     * @param nombre nombre del alumno
     * @param curso curso en el que vamos a consultar
     */
    public ArrayList<DTODataMining> getInteraccionesPorSecuenciaAlumnos (int curso, ArrayList<String> alumnos){
        SequencesHelper lHelper;
        lHelper=SequencesHelper.getInstance();
        return lHelper.getInteraccionesPorSecuenciaAlumnos(curso,alumnos);
    }





    // USO DE LAS ENCUESTAS





    /**
     * Metodo para conseguir el numero de logins por alumno
     */
    public ArrayList<DTODataMining> getQuizTry() {
        QuizHelper qHelper=QuizHelper.getInstance();
        return qHelper.getQuizPorStudents();
    }
    /**
     * Metodo para conseguir las visitas por un alumno
     * @param curso curso que queremos consultar
     */
    public ArrayList<DTODataMining> getQuizPorStudentsPorCurso(int curso){
        QuizHelper qHelper=QuizHelper.getInstance();
        return qHelper.getQuizPorStudentsPorCurso(curso);
    }
    /**
     * Metodo para conseguir encuestas hechas por el alumno
     * @param nombre el nombre del alumno
     */
    public DTODataMining getQuizPorStudent(String nombre){
        QuizHelper qHelper=QuizHelper.getInstance();
        return qHelper.getQuizPorStudent(nombre);
    }
    /**
     * Metodo para conseguir encuestas hechas por el alumno por curso
     * @param nombre el nombre del alumno
     * @param curso curso en el que hacer la consulta
     */
    public DTODataMining getQuizPorStudentPorCurso(String nombre,int curso){
        QuizHelper qHelper=QuizHelper.getInstance();
        return qHelper.getQuizPorStudentPorCurso(nombre,curso);
    }
    /**
     * Metodo para conseguir las encuestas aprobadas
     */
    public ArrayList<DTODataMining> getQuizAprobadasPorStudents(){
        QuizHelper qHelper=QuizHelper.getInstance();
        return qHelper.getQuizAprobadasPorStudents();
    }
    /**
     * Metodo para conseguir las encuestas aprobadas por curso
     * @param curso el curso que se quiere consultar
     */
    public ArrayList<DTODataMining> getQuizAprobadasPorStudentsPorCurso(int curso){
        QuizHelper qHelper=QuizHelper.getInstance();
        return qHelper.getQuizAprobadasPorStudentsPorCurso(curso);
    }
    /**
     * Metodo para conseguir las encuestas aprobadas por alumno
     * @param nombre nombre del alumno
     */
    public DTODataMining getQuizAprobadasPorStudent(String nombre){
        QuizHelper qHelper=QuizHelper.getInstance();
        return qHelper.getQuizAprobadasPorStudent(nombre);
    }
    /**
     * Metodo para conseguir las encuestas aprobadas por alumno
     * @param nombre nombre del alumno
     * @param curso el curso que se quiere consultar
     */
    public DTODataMining getQuizAprobadasPorStudentPorCurso(String nombre,int curso){
        QuizHelper qHelper=QuizHelper.getInstance();
        return qHelper.getQuizAprobadasPorStudentPorCurso(nombre,curso);
    }




    
    // USO DEL FORO






    /**
     * Metodo para conseguir el numero de interacciones creadas por los usuarios en el foro
     */
    public ArrayList<DTODataMining> getUsoForo() {
        ForumHelper fHelper=ForumHelper.getInstance();
        return fHelper.getForumPostedPorStudents();
    }
    /**
     * Metodo el uso del foro por curso
     * @param curso el curso del que queremos consultar
     */
    public ArrayList<DTODataMining> getForumPostedPorStudentsPorCurso(int curso){
        ForumHelper fHelper=ForumHelper.getInstance();
        return fHelper.getForumPostedPorStudentsPorCurso(curso);
    }
    /**
     * Metodo el uso del foro por alumno
     * @param nombre el nombre del alumno
     */
    public DTODataMining getForumPostedPorStudent(String nombre){
        ForumHelper fHelper=ForumHelper.getInstance();
        return fHelper.getForumPostedPorStudent(nombre);
    }
    /**
     * Metodo el uso del foro por alumno y curso
     * @param nombre el nombre del alumno
     * @param curso id del curso del que queremos consultar
     */
    public DTODataMining getForumPostedPorStudentPorCurso(String nombre,int curso){
        ForumHelper fHelper=ForumHelper.getInstance();
        return fHelper.getForumPostedPorStudentPorCurso(nombre,curso);
    }
    /**
     * Metodo para conseguir las secuencias creadas por el alumno
     */
    public ArrayList<DTODataMining> getSecuencias(int curso) {
        SequencesHelper lHelper=SequencesHelper.getInstance();
        return lHelper.getInteraccionesPorSecuenciaAlumnos(curso, (ArrayList<String>) this.getAlumnosStringPorCurso(curso));
    }





    // GLOSARIO





    public ArrayList<DTODataMining> getEntradasGlosarioPorStudents() {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getEntradasGlosarioPorStudents();
    }
    public ArrayList<DTODataMining> getEntradasGlosarioPorStudentsPorCurso(int curso) {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getEntradasGlosarioPorStudentsPorCurso(curso);
    }
    public DTODataMining getEntradasGlosarioPorStudent(String nombre) {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getEntradasGlosarioPorStudent(nombre);
    }
    public DTODataMining getEntradasGlosarioPorStudentPorCurso(String nombre, int curso) {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getEntradasGlosarioPorStudentPorCurso(nombre,curso);
    }
    public DTODataMining getCalificacionesGlosarioPorStudentPorCurso(String nombre, int curso) {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getCalificacionesGlosarioPorStudentPorCurso(nombre,curso);
    }
    public ArrayList<DTODataMining> getCalificacionesGlosarioPorStudentsPorCurso(int curso) {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getCalificacionesGlosarioPorStudentsPorCurso(curso);
    }
    public DTODataMining getActualizacionesGlosarioPorStudentPorCurso(String nombre, int curso) {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getActualizacionesGlosarioPorStudentPorCurso(nombre,curso);
    }
    public ArrayList<DTODataMining>  getActualizacionesGlosarioPorStudentsPorCurso(int curso) {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getActualizacionesGlosarioPorStudentsPorCurso(curso);
    }
    public DTODataMining getCommentsGlosarioPorStudentPorCurso(String nombre, int curso) {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getCommentsGlosarioPorStudentPorCurso(nombre,curso);
    }
    public ArrayList<DTODataMining> getCommentsGlosarioPorStudentsPorCurso(int curso) {
        GlosarioHelper gHelper=GlosarioHelper.getInstance();
        return gHelper.getCommentsGlosarioPorStudentsPorCurso(curso);
    }





    // CHAT




    public DTODataMining getChatUsagePorStudentPorCurso(String nombre, int curso) {
        ChatHelper cHelper=ChatHelper.getInstance();
        return cHelper.getChatUsagePorStudentPorCurso(nombre,curso);
    }
    public ArrayList<DTODataMining> getChatUsagePorStudentsPorCurso(int curso) {
        ChatHelper cHelper=ChatHelper.getInstance();
        return cHelper.getChatUsagePorStudentsPorCurso(curso);
    }





    // WIKI




    public DTODataMining getEdicionWikiPorStudentPorCurso(String nombre, int curso) {
        WikiHelper wHelper=WikiHelper.getInstance();
        return wHelper.getEdicionWikiPorStudentPorCurso(nombre,curso);
    }
    public ArrayList<DTODataMining> getEdicionWikiPorStudentsPorCurso(int curso) {
        WikiHelper wHelper=WikiHelper.getInstance();
        return wHelper.getEdicionWikiPorStudentsPorCurso(curso);
    }
}
